package com.learn.collection;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 功能：List 去重
 * 1. 利用List的contains方法循环遍历,重新排序,只添加一次数据,避免重复：
 * 2. 利用HashSet不能添加重复数据的特性
 * 3. 使用LinkedHashSet删除 ArrayList 中的重复数据（可保持原顺序）
 * 4. 使用java8新特性stream进行List去重（可保持原顺序）
 * 5. 双重for循环去重
 *
 * @author wsh
 * @date 2020/12/21
 */
public class ListOfRemoveDuplicatesUtil {
    /**
     * 功能：删除 ArrayList 中重复数据
     * 利用 List.contains() 去重（1-删除重复数据；2-无法保持原顺序；）
     *
     * @param list
     * @return
     * @author wsh
     * @date 2020/11/19
     */
    public static void removeDuplicates1(List<Integer> list) {
        List<Integer> result = new ArrayList<Integer>(list.size());
        for (Integer i : list) {
            if (!result.contains(i)) {
                result.add(i);
            }
        }
        list.clear();
        list.addAll(result);
    }

    /**
     * 功能：删除 ArrayList 中重复数据
     * 利用 HashSet 去重（1-删除重复数据；2-无法保持原顺序；）
     *
     * @param list
     * @return
     * @author wsh
     * @date 2020/11/19
     */
    public static void removeDuplicates2(List<Integer> list) {
        HashSet<Integer> set = new HashSet<Integer>(list.size());
        List<Integer> result = new ArrayList<Integer>(list.size());
        for (Integer i : list) {
            if (set.add(i)) {
                result.add(i);
            }
        }
        list.clear();
        list.addAll(result);
    }

    /**
     * 功能：删除 ArrayList 中重复数据
     * 利用 LinkedHashSet 去重（1-删除重复数据；2-保持原顺序；）
     *
     * @param list
     * @return
     * @author wsh
     * @date 2020/11/19
     */
    public static void removeDuplicates3(List<Integer> list) {
        LinkedHashSet hashSet = new LinkedHashSet<>(list);
        List<Integer> result = new ArrayList(hashSet);
        list.clear();
        list.addAll(result);
    }

    /**
     * 功能：删除 ArrayList 中重复数据
     * 利用 java8 新特性 stream 进行 List 去重（1-删除重复数据；2-保持原顺序；）
     *
     * @param list
     * @return
     * @author wsh
     * @date 2020/11/19
     */
    public static void removeDuplicates4(List<Integer> list) {
        List<Integer> result = list.stream().distinct().collect(Collectors.toList());
        list.clear();
        list.addAll(result);
    }

    /**
     * 功能：删除 ArrayList 中重复数据
     * 双重for循环去重（1-删除重复数据；2-无法保持原顺序；）
     * 苦涩难懂，但收集到了就暂时列在这里吧，不理解也没关系
     *
     * @param list
     * @return
     * @author wsh
     * @date 2020/11/19
     */
    public static void removeDuplicates5(List<Integer> list) {
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size(); j++) {
                if (i != j && list.get(i).equals(list.get(j))) {
                    list.remove(list.get(j));
                }
            }
        }
    }
}
